Global Object Singleton

Singleton Design
싱글톤 디자인은 특정 컴포넌트의 인스턴스가 애플리케이션 전체에서 단 하나만 존재해야하는 상황을
처리하기 위한 디자인 패턴이다.
struct Database{
/**
* \brief .
*/
Database() {}
};
// .
static Database database{};
일반 객체는 의도하지 않은 은밀한 방식(컴파일러에 의한)으로 생성자가 호출될 수 있다.
복제 생성자, 복제 대입 연산자 등에 의해서 의도하지 않게 생성자가 호출될 수 있음.

static으로 선언해 주면, 위와 같이 의도하지 않은 생성자 호출은 어느정도 막을 수 있다.
하지만, static 전역 객체는 컴파일 단위 바이너리들에서 초기화 순서가 정의되어 있지 않다.
(어느 한 모듈에서 전역 객체를 참조할 때,
그 전역 객체가 참조하는 다른 전역 객체가 초기화 되어 있지 않을 수 있다.)

필요한 객체를 리턴하는 전역 함수를 제공하면, 해당 함수를 호출할 때, 참조를 얻을 수 있다.
Database& get_database(){
static Database database;
return database;
}
C++11 이상부터는 스레드 안정성(MT-Safe)가 보장된다.
C++11 이전 컴파일러에서는 static 객체를 초기화하는 코드 앞뒤로 컴파일러가 락(mutex)을 삽입해서
초기화 와중에 다른 스레드에서 접근하는 것을 방지해 주어야 함